//
// Created by hamlet on 23-4-19.
//

#ifndef COMPILERS_TOKEN_H
#define COMPILERS_TOKEN_H

#include <memory>
#include <map>

enum class TokenType {
    Null = 0,

    // 终结符
    Program, Begin, End, Var, If, Then, Else, Do, While,  // 保留字
    Id,  // 标识符
    Integer, Boolean,  // 类型
    ValueInt,  // 整形常数字面值
    True, False,  // 布尔常量
    OpPlus, OpMinus, OpMultiply, OpDivide,  // 算术运算符
    OpEq, OpGreater, OpLess,  // 关系运算符
    OpAnd, OpOr, OpNot,  // 布尔运算符
    OpLPar, OpRPar, OpLBigPar, OpRBigPar,  // 括号分隔符
    OpSep, OpComma, OpColon, OpAssign,
    Print,  // 向控制台打印

    // 非终结符
    P, S, S1, S2, S2_, E, E_, T, T_, F, E1, E1_, E2, E2_, T2,
    IdList, IdList_, Type, Printable,
    M, N,
};


// 词法单元符号
struct Token {
    TokenType type = TokenType::Null;
    int value = -1;
    std::weak_ptr<Token> parent;
    std::vector<std::shared_ptr<Token>> children;
    std::map<std::string, int> attr;
};

#endif //COMPILERS_TOKEN_H
